home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994 August: Tool Chest / Dev.CD Aug 94.toast / Tool Chest / Games / Game Sample Code / SpriteWorld 1.0b3 / Sources / Frame.c < prev    next >
Encoding:
Text File  |  1993-06-07  |  10.3 KB  |  488 lines  |  [TEXT/KAHL]

  1. ///--------------------------------------------------------------------------------------
  2. //    Frame.c
  3. //
  4. //    Created:    Sunday, November 15, 1992 at 2:37:37 AM
  5. //    By:        Tony Myles
  6. //
  7. //    Copyright: © 1991-93 Tony Myles, All rights reserved worldwide
  8. //
  9. //    Description:    implementation of the frame stuff
  10. ///--------------------------------------------------------------------------------------
  11.  
  12.  
  13. #ifndef __MEMORY__
  14. #include <Memory.h>
  15. #endif
  16.  
  17. #ifndef __RESOURCES__
  18. #include <Resources.h>
  19. #endif
  20.  
  21. #ifndef __ERRORS__
  22. #include <Errors.h>
  23. #endif
  24.  
  25. #ifndef __SPRITEWORLDUTILS__
  26. #include <SpriteWorldUtils.h>
  27. #endif
  28.  
  29. #ifndef __FRAME__
  30. #include <Frame.h>
  31. #endif
  32.  
  33.  
  34. ///--------------------------------------------------------------------------------------
  35. //    SWCreateFrame
  36. ///--------------------------------------------------------------------------------------
  37.  
  38. SW_PASCAL OSErr SWCreateFrame(
  39.     FramePtr* newFrameP,
  40.     CGrafPtr srcGrafP,
  41.     Rect* frameRect)
  42. {
  43.     OSErr err = noErr;
  44.     FramePtr tempFrameP;
  45.     short pixelSize;
  46.  
  47.     *newFrameP = NULL;
  48.  
  49.     tempFrameP = (FramePtr)NewPtrClear((Size)sizeof(FrameRec));
  50.  
  51.     if (tempFrameP != NULL)
  52.     {
  53.         tempFrameP->isColor = SWHasColorQuickDraw();
  54.  
  55.         if (srcGrafP == NULL)
  56.         {
  57.             if (tempFrameP->isColor)
  58.             {
  59.                 err = SWCreateBestCGrafPort(&tempFrameP->framePort.colorGrafP, frameRect);
  60.             }
  61.             else
  62.             {
  63.                 err = SWCreateGrafPort(&tempFrameP->framePort.monoGrafP, frameRect);
  64.             }
  65.         }
  66.         else
  67.         {
  68.             tempFrameP->framePort.colorGrafP = srcGrafP;
  69.         }
  70.  
  71.         if (err == noErr)
  72.         {
  73.             pixelSize = tempFrameP->isColor ?
  74.                     (**tempFrameP->framePort.colorGrafP->portPixMap).pixelSize : 1;            
  75.  
  76.             tempFrameP->frameRect = tempFrameP->framePort.colorGrafP->portRect;
  77.  
  78.             tempFrameP->frameRowBytes = tempFrameP->isColor ?
  79.                     (**tempFrameP->framePort.colorGrafP->portPixMap).rowBytes & 0x7FFF :
  80.                     tempFrameP->framePort.monoGrafP->portBits.rowBytes;
  81.  
  82.             tempFrameP->frameRowLongs = (tempFrameP->frameRect.right -
  83.                     tempFrameP->frameRect.left) >> 2;
  84.  
  85.                 // ••• the following calculation assumes 32 bits in a long word! •••
  86.             tempFrameP->leftAlignFactor = ~((32 / pixelSize) - 1);
  87.             tempFrameP->rightAlignFactor = (32 / pixelSize) - 1;
  88.  
  89.             *newFrameP = tempFrameP;
  90.         }
  91.     }
  92.     else
  93.     {
  94.         err = MemError();
  95.     }
  96.  
  97.     if (err != noErr)
  98.     {
  99.         if (tempFrameP != NULL)
  100.         {
  101.             if (tempFrameP->framePort.colorGrafP != NULL)
  102.             {
  103.                 if (tempFrameP->isColor)
  104.                 {
  105.                     SWDisposeCGrafPort(tempFrameP->framePort.colorGrafP);
  106.                 }
  107.                 else
  108.                 {
  109.                     SWDisposeGrafPort((GrafPtr)tempFrameP->framePort.monoGrafP);
  110.                 }
  111.             }
  112.  
  113.             DisposePtr((Ptr)tempFrameP);
  114.         }
  115.     }
  116.  
  117.     return err;
  118. }
  119.  
  120.  
  121. ///--------------------------------------------------------------------------------------
  122. //    SWCreateFrameFromCIconResource
  123. ///--------------------------------------------------------------------------------------
  124.  
  125. SW_PASCAL OSErr SWCreateFrameFromCIconResource(
  126.     FramePtr* newFrameP,
  127.     short iconResID,
  128.     MaskType maskType)
  129. {
  130.     OSErr err;
  131.     GrafPtr savePort;
  132.     FramePtr tempFrameP;
  133.     CIconHandle cIconH;
  134.     RgnHandle maskRgn;
  135.     Rect frameRect;
  136.  
  137.     *newFrameP = NULL;
  138.     tempFrameP = NULL;
  139.     cIconH = NULL;
  140.  
  141.     GetPort(&savePort);
  142.  
  143.     err = SWGetCIcon(&cIconH, iconResID);
  144.  
  145.     if (err == noErr)
  146.     {
  147.         HNoPurge((Handle)cIconH);
  148.  
  149.         frameRect = (**cIconH).iconPMap.bounds;
  150.  
  151.         err = SWCreateFrame(&tempFrameP, NULL, &frameRect);
  152.     }
  153.  
  154.     if (err == noErr)
  155.     {
  156.         SetPort(tempFrameP->framePort.monoGrafP);
  157.  
  158.         SWPlotCIcon(cIconH, &frameRect);
  159.     }
  160.  
  161.     if (err == noErr)
  162.     {
  163.             // make a region mask
  164.         if ((maskType & kRegionMask) != 0)
  165.         {
  166.             err = SWCreateRegionFromCIconMask(&maskRgn, cIconH);
  167.  
  168.             if (err == noErr)
  169.             {
  170.                 SWSetFrameMaskRgn(tempFrameP, maskRgn);
  171.             }
  172.         }
  173.     }
  174.  
  175.     if (err == noErr)
  176.     {
  177.             // make a pixel mask
  178.         if ((maskType & kPixelMask) != 0)
  179.         {
  180.             if (tempFrameP->isColor)
  181.             {
  182.                 err = SWCreateCGrafPortFromCIconMask(&tempFrameP->maskPort.colorGrafP, cIconH);
  183.             }
  184.             else
  185.             {
  186.                 err = SWCreateGrafPortFromCIconMask(&tempFrameP->maskPort.monoGrafP, cIconH);
  187.             }
  188.         }
  189.     }
  190.  
  191.     if (cIconH != NULL)
  192.     {
  193.         SWDisposeCIcon(cIconH);
  194.     }
  195.  
  196.     if (err == noErr)
  197.     {
  198.         *newFrameP = tempFrameP;
  199.     }
  200.  
  201.     if (err != noErr)
  202.     {
  203.             // an error occurred so dispose of anything we managed to create
  204.         if (tempFrameP != NULL)
  205.         {
  206.             SWDisposeFrame(tempFrameP);
  207.         }
  208.     }
  209.  
  210.     SetPort(savePort);
  211.  
  212.     return err;
  213. }
  214.  
  215.  
  216. ///--------------------------------------------------------------------------------------
  217. //    SWCreateFrameFromPictResource
  218. ///--------------------------------------------------------------------------------------
  219.  
  220. SW_PASCAL OSErr SWCreateFrameFromPictResource(
  221.     FramePtr* newFrameP,
  222.     short pictResID,
  223.     short maskResID,
  224.     MaskType maskType)
  225. {
  226.     OSErr err;
  227.     PicHandle newPictH;
  228.     FramePtr tempFrameP;
  229.     RgnHandle maskRgn;
  230.     Rect frameRect;
  231.  
  232.     tempFrameP = NULL;
  233.     *newFrameP = NULL;
  234.  
  235.     newPictH = GetPicture(pictResID);
  236.  
  237.     if (newPictH != NULL)
  238.     {
  239.         frameRect.top = 0;
  240.         frameRect.left = 0;
  241.         frameRect.right = (**newPictH).picFrame.right - (**newPictH).picFrame.left;
  242.         frameRect.bottom = (**newPictH).picFrame.bottom - (**newPictH).picFrame.top;
  243.  
  244.         err = SWCreateFrame(&tempFrameP, NULL, &frameRect);
  245.  
  246.         if (err == noErr)
  247.         {
  248.             SetPort(tempFrameP->framePort.monoGrafP);
  249.  
  250.             DrawPicture(newPictH, &frameRect);
  251.         }
  252.  
  253.             // make a region mask
  254.         if (((maskType & kRegionMask) != 0) && (err == noErr))
  255.         {
  256.             err = SWCreateRegionFromPictResource(&maskRgn, maskResID);
  257.  
  258.             if (err == noErr)
  259.             {
  260.                 SWSetFrameMaskRgn(tempFrameP, maskRgn);
  261.             }
  262.         }
  263.  
  264.             // make a pixel mask
  265.         if (((maskType & kPixelMask) != 0) && (err == noErr))
  266.         {
  267.             if (tempFrameP->isColor)
  268.             {
  269.                 err = SWCreateCGrafPortFromPictResource(&tempFrameP->maskPort.colorGrafP, maskResID);
  270.             }
  271.             else
  272.             {
  273.                 err = SWCreateGrafPortFromPictResource(&tempFrameP->maskPort.monoGrafP, maskResID);
  274.             }
  275.         }
  276.  
  277.         if (err == noErr)
  278.         {
  279.             *newFrameP = tempFrameP;
  280.         }
  281.         else
  282.         {
  283.                 // an error occurred so dispose of anything we managed to create
  284.             if (tempFrameP != NULL)
  285.             {
  286.                 SWDisposeFrame(tempFrameP);
  287.             }
  288.         }
  289.  
  290.         ReleaseResource((Handle)newPictH);
  291.     }
  292.     else
  293.     {
  294.         err = ResError();
  295.  
  296.         if (err == noErr)
  297.         {
  298.             err = resNotFound;
  299.         }
  300.     }
  301.  
  302.     return err;
  303. }
  304.  
  305.  
  306. ///--------------------------------------------------------------------------------------
  307. //    SWDisposeFrame
  308. ///--------------------------------------------------------------------------------------
  309.  
  310. SW_PASCAL void SWDisposeFrame(
  311.     FramePtr oldFrameP)
  312. {
  313.     if (oldFrameP != NULL)
  314.     {
  315.         if (oldFrameP->framePort.colorGrafP != NULL)
  316.         {
  317.             if (oldFrameP->isColor)
  318.             {
  319.                 SWDisposeCGrafPort(oldFrameP->framePort.colorGrafP);
  320.             }
  321.             else
  322.             {
  323.                 SWDisposeGrafPort(oldFrameP->framePort.monoGrafP);
  324.             }
  325.  
  326.             oldFrameP->framePort.colorGrafP = NULL;
  327.         }
  328.  
  329.         if (oldFrameP->maskRgn != NULL)
  330.         {
  331.             DisposeRgn(oldFrameP->maskRgn);
  332.  
  333.             oldFrameP->maskRgn = NULL;
  334.         }
  335.  
  336.         if (oldFrameP->maskPort.colorGrafP != NULL)
  337.         {
  338.             if (oldFrameP->isColor)
  339.             {
  340.                 SWDisposeCGrafPort(oldFrameP->maskPort.colorGrafP);
  341.             }
  342.             else
  343.             {
  344.                 SWDisposeGrafPort(oldFrameP->maskPort.monoGrafP);
  345.             }
  346.  
  347.             oldFrameP->maskPort.colorGrafP = NULL;
  348.         }
  349.  
  350.         DisposePtr((Ptr)oldFrameP);
  351.     }
  352. }
  353.  
  354.  
  355. ///--------------------------------------------------------------------------------------
  356. //    SWSetFrameMaskRgn
  357. ///--------------------------------------------------------------------------------------
  358.  
  359. SW_PASCAL void SWSetFrameMaskRgn(
  360.     FramePtr srcFrameP,
  361.     RgnHandle maskRgn)
  362. {
  363.     srcFrameP->maskRgn = maskRgn;
  364.  
  365.     srcFrameP->offsetPoint.h = (**maskRgn).rgnBBox.left;
  366.     srcFrameP->offsetPoint.v = (**maskRgn).rgnBBox.top;
  367. }
  368.  
  369.  
  370. ///--------------------------------------------------------------------------------------
  371. //    SWGetFrameMaskRgn
  372. ///--------------------------------------------------------------------------------------
  373.  
  374. SW_PASCAL RgnHandle SWGetFrameMaskRgn(
  375.     FramePtr srcFrameP)
  376. {
  377.     return srcFrameP->maskRgn;
  378. }
  379.  
  380.  
  381. ///--------------------------------------------------------------------------------------
  382. //    SWLockFrame
  383. ///--------------------------------------------------------------------------------------
  384.  
  385. SW_PASCAL void SWLockFrame(
  386.     FramePtr srcFrameP)
  387. {
  388.     srcFrameP->isFrameLocked = true;
  389.  
  390.     if (srcFrameP->isColor)
  391.     {
  392.         PixMapHandle pixMapH;
  393.  
  394.         pixMapH = srcFrameP->framePort.colorGrafP->portPixMap;
  395.         HLock((Handle)pixMapH);
  396.  
  397.         srcFrameP->framePix.pixMapP = *pixMapH;
  398.         srcFrameP->frameBaseAddr = (unsigned long *)(**pixMapH).baseAddr;
  399.  
  400.         if (srcFrameP->maskPort.colorGrafP != NULL)
  401.         {
  402.             pixMapH = srcFrameP->maskPort.colorGrafP->portPixMap;
  403.             HLock((Handle)pixMapH);
  404.  
  405.             srcFrameP->isMaskLocked = true;
  406.  
  407.             srcFrameP->maskPix.pixMapP = *pixMapH;
  408.  
  409.             srcFrameP->maskBaseAddr = (unsigned long *)(**pixMapH).baseAddr;
  410.         }
  411.     }
  412.     else
  413.     {
  414.         srcFrameP->framePix.bitMapP = &srcFrameP->framePort.monoGrafP->portBits;
  415.         srcFrameP->frameBaseAddr = (unsigned long *)srcFrameP->framePix.bitMapP->baseAddr;
  416.  
  417.         if (srcFrameP->maskPort.monoGrafP != NULL)
  418.         {
  419.             srcFrameP->maskPix.bitMapP = &srcFrameP->maskPort.monoGrafP->portBits;
  420.             srcFrameP->maskBaseAddr = (unsigned long *)srcFrameP->maskPix.bitMapP->baseAddr;
  421.         }
  422.     }
  423. }
  424.  
  425.  
  426. ///--------------------------------------------------------------------------------------
  427. //    SWUnlockFrame
  428. ///--------------------------------------------------------------------------------------
  429.  
  430. SW_PASCAL void SWUnlockFrame(
  431.     FramePtr srcFrameP)
  432. {
  433.     if (srcFrameP->isColor)
  434.     {
  435.         if (srcFrameP->framePort.colorGrafP != NULL)
  436.         {
  437.             HUnlock((Handle)srcFrameP->framePort.colorGrafP->portPixMap);
  438.         }
  439.  
  440.         if (srcFrameP->maskPort.colorGrafP != NULL)
  441.         {
  442.             HUnlock((Handle)srcFrameP->maskPort.colorGrafP->portPixMap);
  443.         }
  444.     }
  445.  
  446.     srcFrameP->isFrameLocked = false;
  447.     srcFrameP->isMaskLocked = false;
  448.  
  449.     srcFrameP->framePix.pixMapP = NULL;
  450.     srcFrameP->frameBaseAddr = NULL;
  451.     srcFrameP->maskPix.pixMapP = NULL;
  452.     srcFrameP->maskBaseAddr = NULL;
  453. }
  454.  
  455.  
  456. ///--------------------------------------------------------------------------------------
  457. //    SWCopyFrame
  458. ///--------------------------------------------------------------------------------------
  459.  
  460. SW_PASCAL void SWCopyFrame(
  461.     FramePtr srcFrameP,
  462.     FramePtr dstFrameP)
  463. {
  464.     if (srcFrameP->isFrameLocked)
  465.     {
  466.         CopyBits(srcFrameP->framePix.bitMapP,
  467.                     dstFrameP->framePix.bitMapP,
  468.                     &srcFrameP->frameRect,
  469.                     &srcFrameP->frameRect,
  470.                     srcCopy, srcFrameP->maskRgn);
  471.     }
  472. }
  473.  
  474.  
  475. ///--------------------------------------------------------------------------------------
  476. //    SWSetFrameRect
  477. ///--------------------------------------------------------------------------------------
  478.  
  479. SW_PASCAL void SWSetFrameRect(
  480.     FramePtr srcFrameP,
  481.     Rect* newFrameRect)
  482. {
  483.     srcFrameP->frameRect = *newFrameRect;
  484.     srcFrameP->frameRowLongs = (newFrameRect->right - newFrameRect->left) >> 2;
  485. }
  486.  
  487.  
  488.